{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "42be2847",
   "metadata": {},
   "source": [
    "# 算法——解决方案 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e8ff9726",
   "metadata": {},
   "source": [
    "## 2.2 何谓算法分析\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "978010eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sumOfN(n):\n",
    "    theSum = 0\n",
    "    for i in range(1, n+1):\n",
    "        theSum = theSum = i\n",
    "    return theSum\n",
    "\n",
    "def foo(tom):\n",
    "    fred = 0\n",
    "    for bill in range(1, tom+1):\n",
    "        barney = bill\n",
    "        fred = fred + barney\n",
    "    return fred\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d856a324",
   "metadata": {},
   "source": [
    "- 算法分析关心的是基于所使用的计算资源比较算法，甲算法比乙算法好，依据是甲算法有更高的资源利用率或使用更少的资源\n",
    "- 计算机资源的两种思考方式：\n",
    "    - 算法在解决问题时要占用的空间或内存\n",
    "    - 算法执行所需的时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "258a01e4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sum2 is 1000000 required  0.0171499 seconds\n",
      "Sum2 is 1000000 required  0.0192316 seconds\n",
      "Sum2 is 1000000 required  0.0171721 seconds\n",
      "Sum2 is 1000000 required  0.0172114 seconds\n",
      "Sum2 is 1000000 required  0.0171180 seconds\n",
      "Sum3 is 500000500000 required  0.0000007 seconds\n",
      "Sum3 is 500000500000 required  0.0000005 seconds\n",
      "Sum3 is 500000500000 required  0.0000002 seconds\n",
      "Sum3 is 500000500000 required  0.0000000 seconds\n",
      "Sum3 is 500000500000 required  0.0000002 seconds\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "def sumOfN2(n):\n",
    "    start = time.time() \n",
    "\n",
    "    theSum = 0\n",
    "    for i in range(1, n+1):\n",
    "        theSum = theSum = i\n",
    "\n",
    "    end = time.time()\n",
    "\n",
    "    return theSum, end-start\n",
    "for i in range(5):\n",
    "    print(\"Sum2 is %d required %10.7f seconds\" % sumOfN2(1000_000))\n",
    "def sumOfN3(n):\n",
    "    start = time.time()\n",
    "    theSum = (n*(n+1))/2\n",
    "    end = time.time()\n",
    "    return theSum, end - start\n",
    "for i in range(5):\n",
    "    print(\"Sum3 is %d required %10.7f seconds\" % sumOfN3(1000_000))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b651da33",
   "metadata": {},
   "source": [
    "### 2.2.1 大O记法\n",
    "- 数量级\n",
    "- 最坏情况，最好情况，普通情况\n",
    "- 大O函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b11826d6",
   "metadata": {},
   "source": [
    "### 2.2.2 异序词检测示例\n",
    "- 要检查两个字符串长度相同，并且都是由26个小写英文字母组成。目标是编写一个布尔函数，并判断它们是否为异序词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b7debe4f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "#My version:\n",
    "def detected2str(str1, str2):\n",
    "    if len(str1) != len(str2):\n",
    "        return False\n",
    "    for s1 in str1:\n",
    "        if not s1.islower() or not s1.isalpha() or s1 not in str2:\n",
    "            return False\n",
    "    for s2 in str2:\n",
    "        if not s2.islower() or not s2.isalpha() or s2 not in str1:\n",
    "            return False\n",
    "    return True \n",
    "print(detected2str(\"teles\", \"steel\"))       \n",
    "#清点法:O(n^2)\n",
    "def anagramSolution(s1, s2):\n",
    "    alist = list(s2)\n",
    "    pos1 = 0\n",
    "    stillOK = True\n",
    "    while pos1 < len(s1) and stillOK:\n",
    "        pos2 = 0\n",
    "        found = False\n",
    "        while pos2 < len(alist) and not found:\n",
    "            if s1[pos1] == alist[pos2]:\n",
    "                found = True\n",
    "            else:\n",
    "                pos2 = pos2 +1\n",
    "        \n",
    "        if found:\n",
    "            alist[pos2] = None\n",
    "        else:\n",
    "            stillOK = False\n",
    "        \n",
    "        pos1 = pos1 + 1\n",
    "    \n",
    "    return stillOK\n",
    "print(anagramSolution(\"steel\",\"steels\"))\n",
    "#排序法:O(n^2) or O(nlogn)\n",
    "def anagramSolution2(s1, s2):\n",
    "    alist1 = list(s1)\n",
    "    alist2 = list(s2)\n",
    "\n",
    "    alist1.sort()\n",
    "    alist2.sort()\n",
    "\n",
    "    pos = 0\n",
    "    matches = True\n",
    "\n",
    "    while pos < len(s1) and matches:\n",
    "        if alist1[pos] == alist2[pos]:\n",
    "            pos = pos+1\n",
    "        else:\n",
    "            matches = False\n",
    "    return matches\n",
    "print(anagramSolution2(\"steel\", \"steelz\"))\n",
    "#蛮力法：O(n!)\n",
    "def anagramSolution3(chars, s2, prefix=\"\"):\n",
    "    # 递归基：chars 空了，比较\n",
    "    if not chars:\n",
    "        return prefix == s2\n",
    "\n",
    "    # 枚举每一个字符作为下一个字母\n",
    "    for i, ch in enumerate(chars):\n",
    "        # 去掉当前字符继续递归\n",
    "        if anagramSolution3(chars[:i] + chars[i+1:], s2, prefix + ch):\n",
    "            return True\n",
    "    return False\n",
    "\n",
    "print(anagramSolution3(chars=list(\"steel\"), s2 = \"steel\"))   # False，因为长度都不同\n",
    "#计数法：O(n)\n",
    "def anagramSolution4(s1, s2):\n",
    "    c1 = [0]*26\n",
    "    c2 = [0]*26\n",
    "\n",
    "    for i in range(len(s1)):\n",
    "        pos = ord(s1[i]) - ord('a')\n",
    "        c1[pos] = c1[pos] + 1\n",
    "\n",
    "    for i in range(len(s2)):\n",
    "        pos = ord(s2[i]) - ord('a')\n",
    "        c2[pos] = c2[pos] + 1\n",
    "\n",
    "    j = 0\n",
    "    stillOK = True\n",
    "    while j < 26 and stillOK:\n",
    "        if c1[j] == c2[j]:\n",
    "            j = j + 1\n",
    "        else:\n",
    "            stillOK = False\n",
    "\n",
    "    return stillOK     \n",
    "anagramSolution4(\"steel\", \"steel\")   "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c07a30c8",
   "metadata": {},
   "source": [
    "## 2.3 Python数据结构的性能\n",
    "### 2.3.1 列表\n",
    "- 生成列表的四种方式性能对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "8456ba7a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "concat       : 0.593 ms\n",
      "append       : 0.024 ms\n",
      "comprehension: 0.015 ms\n",
      "list_range   : 0.008 ms\n"
     ]
    }
   ],
   "source": [
    "def test1():\n",
    "    l = []\n",
    "    for i in range(1000):\n",
    "        l = l+[i]\n",
    "def test2():\n",
    "    l = []\n",
    "    for i in range(1000):\n",
    "        l.append(i)\n",
    "def test3():\n",
    "    l = [i for i in range(1000)]\n",
    "def test4():\n",
    "    l = list(range(1000))\n",
    "from timeit import Timer\n",
    "# Build the Timer objects with the correct setup string\n",
    "setup = \"from __main__ import test1, test2, test3, test4\"\n",
    "\n",
    "for name, func in ((\"concat\", \"test1\"), (\"append\", \"test2\"),\n",
    "                   (\"comprehension\", \"test3\"), (\"list_range\", \"test4\")):\n",
    "    t = Timer(f\"{func}()\", setup)\n",
    "    # run each test 1000 times and report the total time\n",
    "    print(f\"{name:13s}: {t.timeit(1000):.3f} ms\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc8d58e1",
   "metadata": {},
   "source": [
    "- Python列表操作的大O效率\n",
    "  \n",
    " 操作            大O记法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5188908",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0068598000216298\n",
      "2.8699985705316067e-05\n"
     ]
    }
   ],
   "source": [
    "#pop的性能分析\n",
    "import timeit\n",
    "popzero = timeit.Timer(\"x.pop(0)\", \"from __main__ import x\")\n",
    "popend = timeit.Timer(\"x.pop()\", \"from __main__ import x\")\n",
    "\n",
    "x = list(range(2_000_000))\n",
    "print(popzero.timeit(number = 1000))\n",
    "\n",
    "x = list(range(2_000_000))\n",
    "print(popend.timeit(number = 1000))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fe94bf95",
   "metadata": {},
   "outputs": [],
   "source": [
    "import timeit\n",
    "popzero = timeit.Timer(\"x.pop(0)\", \"from __main__ import x\")\n",
    "popend = timeit.Timer(\"x.pop()\", \"from __main__ import x\")\n",
    "\n",
    "print(\"pop(0) pop()\")\n",
    "for i in range(1_000_000, 100_000_001, 1_000_000):\n",
    "    x = list(range(i))\n",
    "    pt = popend.timeit(number = 1000)\n",
    "    x = list(range(i))\n",
    "    pz = popzero.timeit(number = 1000)\n",
    "    print(\"%15.5f, %15.5f\" % (pz, pt) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b14a26db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fWzt2rVs4sSJun0OHDjAxGIx69OnD9uyZQv7/fffWXR0NBMIBOynn34y+D0ICwtjr732mt5rNWnSJNa7d2+2ePFilpCQwN544w0GgH388ce6+6ekpDAALCQkhN13331s27ZtbOvWraxfv35MLBazw4cP6/ZNTExkr732Gvvll19YYmIi++2339j48eOZk5MTu3z5sm4/7rwGBQWxxx9/nP35559sx44dLDc3V3fb/v37dft36tSJtW/fnv3www8sMTGRbdu2jb322mt6+zz33HMMAJszZ47u98TX15eFhISwe/fuWXyeuX3N+dPCjTkkJIQ98sgjbPv27Wzjxo2sffv2zM3Njd24cUO3748//sgAsOjoaPb777+zLVu2sD59+jCJRMIOHjyo22/RokW63/3//ve/bNeuXWzFihW6949SqdTtO3PmTObn52cwroEDB7J+/foZbE9KSmIA2Ndff623/dixYwwA+/PPP+t8vq+++ipzcnJihYWFetu//PJLBoCdP3+eMcbY0qVLmUgkYosWLWJ79+5l8fHxbOXKlSw2NrbO4/P19eR06dKFTZgwoc7nQEhDUCBLSA1cAHP06FGmUqlYcXEx27FjB/P19WWurq4sMzOTHTlyxCBwYYyx1NRU5uTkxBYsWKDbxv1R37t3r8FjTZs2jTk7O+tti4+PZwDY8uXL9bZv2bJFL5BmTBvIikQiduXKFb19uT9oMTExetvnzZvHALC5c+fqbR8/fjzz8vIy+Zqo1WqmUqnY999/z0QiEcvLyzN4fseOHdO7T0REBBs1apTu53fffZcBYAkJCSYfZ/PmzQwA27Ztm972EydOMADsyy+/NHlfxhgLDw9n4eHhrLy83OQ+AwcOZH5+fqy4uFi3rbKykkVGRrLg4GCm0WgYY9W/B7UD/PHjxzMAbMWKFXrbe/bsyXr37q37mQtkAwMD9cZTVFTEvLy82IMPPmhyjJWVlUypVLIOHTqwV199VbedO6/333+/wX1qB7I5OTkMAFu5cqXJx7l06RIDwGbPnq23nQvM3n77bd02c88zY4yNGDGCiUQik49be8y9e/fWve6MMXbr1i0mFovZM888wxjT/v4FBgaybt26MbVarduvuLiY+fn5scGDB+u2cYFXzdeNserArWZqUJcuXdjo0aMNxtWhQweD58QYY+np6QwAW7Jkid52pVLJ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cX9wcBBGoxFqtRrx8fHYuXMn9uzZg/feew/p6ekYGxtDR0cHkpOTsXXrVsfXffzxx4iIiPDo8oAsskREd8GVK1dgNBqdtqnVasTExDht++CDDxAREYG0tDT4+Pjgq6++Qnh4OJYtWwbgxpULvv/+e6xbtw5+fn649957p+xrtjVuVVFRgZMnT+LEiROYmJjAxMQEACA4OBiBgYEoLy/HSy+9BLvdjpycHJjNZpw9exYqlQo6nW5efjZEJG89PT3YuHGj435ZWRkAQKfTob6+Hnq9HlVVVXj55Zfx+++/IyQkBBqNxqnE2u121NfXo7i4eNo3ss6JSERE80qn04kAptx0Op0oiqIIQGxqahJFURTr6urEtLQ0MSAgQAwKChI3b94s9vX1OdZqaWkRV69eLS5atEiMjY294/5mW+PW/W3YsOGO2fR6vSiKomi328WDBw+KCQkJ4uLFi8XQ0FDxscceEzs7O+f7x0RE5DFBFEXR/RpMRERERCQNfiACEREREckSiywRERERyRKLLBERERHJEossEREREckSiywRERERyRKLLBERERHJEossEREREckSiywRERERyRKLLBERERHJEossEREREckSiywRERERyRKLLBERERHJ0v8ASqYQSCXlxuwAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 700x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import timeit\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "popzero = timeit.Timer(\"x.pop(0)\", \"from __main__ import x\")\n",
    "popend  = timeit.Timer(\"x.pop()\",  \"from __main__ import x\")\n",
    "\n",
    "sizes  = []      # 列表长度\n",
    "t_pop0 = []      # pop(0) 耗时\n",
    "t_pop  = []      # pop()  耗时\n",
    "\n",
    "for n in range(1_000_000, 50_000_001, 1_000_000):\n",
    "    sizes.append(n)\n",
    "\n",
    "    # 测 pop()\n",
    "    x = list(range(n))\n",
    "    t_pop.append(popend.timeit(number=1000))\n",
    "\n",
    "    # 测 pop(0)\n",
    "    x = list(range(n))\n",
    "    t_pop0.append(popzero.timeit(number=1000))\n",
    "\n",
    "# 画图\n",
    "plt.figure(figsize=(7,4))\n",
    "plt.plot(sizes, t_pop0, label='list.pop(0)', marker='o')\n",
    "plt.plot(sizes, t_pop,  label='list.pop()',  marker='s')\n",
    "plt.xlabel('List size')\n",
    "plt.ylabel('Time for 1000 pops (seconds)')\n",
    "plt.title('Performance comparison: pop(0) vs pop()')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3d46cfd",
   "metadata": {},
   "source": [
    "### 2.3.2 字典\n",
    "\n",
    "  Python字典操作的大O效率\n",
    "  操作    大O效率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ad11c93c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000,      0.035,      0.000\n",
      "30000,      0.097,      0.000\n",
      "50000,      0.160,      0.000\n",
      "70000,      0.214,      0.000\n",
      "90000,      0.273,      0.000\n",
      "110000,      0.336,      0.000\n",
      "130000,      0.415,      0.000\n",
      "150000,      0.451,      0.000\n",
      "170000,      0.530,      0.000\n",
      "190000,      0.567,      0.000\n",
      "210000,      0.608,      0.000\n",
      "230000,      0.663,      0.000\n",
      "250000,      0.742,      0.001\n",
      "270000,      0.838,      0.001\n",
      "290000,      0.880,      0.000\n",
      "310000,      0.962,      0.000\n",
      "330000,      1.020,      0.001\n",
      "350000,      1.051,      0.001\n",
      "370000,      1.133,      0.001\n",
      "390000,      1.168,      0.000\n",
      "410000,      1.190,      0.000\n",
      "430000,      1.239,      0.000\n",
      "450000,      1.331,      0.001\n",
      "470000,      1.465,      0.000\n",
      "490000,      1.472,      0.000\n",
      "510000,      1.543,      0.000\n",
      "530000,      1.608,      0.001\n",
      "550000,      1.767,      0.000\n",
      "570000,      1.743,      0.001\n",
      "590000,      1.756,      0.001\n",
      "610000,      1.808,      0.001\n",
      "630000,      1.965,      0.001\n",
      "650000,      1.995,      0.001\n",
      "670000,      2.008,      0.001\n",
      "690000,      2.052,      0.001\n",
      "710000,      2.253,      0.001\n",
      "730000,      2.225,      0.001\n",
      "750000,      2.376,      0.001\n",
      "770000,      2.418,      0.001\n",
      "790000,      2.412,      0.001\n",
      "810000,      2.640,      0.001\n",
      "830000,      2.654,      0.001\n",
      "850000,      2.685,      0.001\n",
      "870000,      2.744,      0.001\n",
      "890000,      2.835,      0.001\n",
      "910000,      2.835,      0.000\n",
      "930000,      2.970,      0.001\n",
      "950000,      3.015,      0.001\n",
      "970000,      3.163,      0.001\n",
      "990000,      3.159,      0.001\n"
     ]
    }
   ],
   "source": [
    "import timeit\n",
    "import random\n",
    "\n",
    "for i in range(10_000, 1_000_001, 20_000):\n",
    "    t = timeit.Timer(\"random.randrange(%d) in x\" % i,\n",
    "                     \"from __main__ import random, x\")\n",
    "    x = list(range(i))\n",
    "    lst_time = t.timeit(number = 1000)\n",
    "    x = {j:None for j in range(i)}\n",
    "    d_time = t.timeit(number = 1000)\n",
    "    print(\"%d, %10.3f, %10.3f\" % (i, lst_time, d_time))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d8299ab",
   "metadata": {},
   "source": [
    "- 列表的包含操作是O(n)，字典的包含操作O(1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
